Adaptive Probe Volumes 対応 URP Shader
https://gyazo.com/552c30356a957e691effbade65a018a1
Unity: 2023.1 (URP: 15.0.5)
-.icon
SH Evaluation Mode: PerPixel
Includes
code:hlsl
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" Lighting.hlsl 内に定義されているマクロを使用するため include に追加する
Keywords
https://gyazo.com/0e1bd34a42618dfb6bb351bc12263060
code:hlsl
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl" 事前定義済みの directive
https://gyazo.com/c6c3c07148a8ac7efee0949b52d98ed3
つまり, 従来の Light Probe を使用する場合はどちらも設定されておらず, Volume Probe が有効ならどちらかがセットされている
Vertex Shader
code:hlsl
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL; // Add
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float3 positionWS : TEXCOORD0; // Add
float3 normalWS : TEXCOORD1; // Add
}
Varyings vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.positionWS = TransformObjectToWorld(input.positionOS.xyz); // Add
output.normalWS = NormalizeNormalPerVertex(TransformObjectToWorldNormal(input.normalOS)); // Add
return output;
}
Fragment shader で使用するものを計算しておく
Fragment Shader
code:hlsl
void frag(Varyings input, out half4 outColor : SV_Target0)
{
#if defined(PROBE_VOLUMES_L1) || defined(PROBE_VOLUMES_L2) half3 vierDirWS = GetWorldSpaceNormalizeViewDir(input.positionWS);
vierDirWS = SafeNormalize(vierDirWS);
EvaluateAdaptiveProbeVolume(
GetAbsolutePositionWS(input.positionWS),
input.normalWS,
vierDirWS,
input.positionCS.xy,
outColor.rgb
);
outColor.a = 1.0;
}
-.icon
SH Evaluation Mode: PerVertex
https://gyazo.com/5d888b25947c3a453196de6e34034391
URP 15.0.5 での SH Evaluate Mode: Mixed について
URP 15.0.5 (Unity 2023.1) 現在, Probe Volume での Mixed は PerVertex と同じ処理になっている (Light Probe の方は Mix されてる)
まだアーリーなのもあってドキュメントがないため, そのうち実装されるのかは謎
Mixed にしていても Vertex Shader での計算結果だけが帰る
code:GlobalIllumination.hlsl
// l.90
half3 SampleProbeVolumePixel(in half3 vertexValue, in float3 absolutePositionWS, in float3 normalWS, in float3 viewDir, in float2 positionSS)
{
#if defined(EVALUATE_SH_VERTEX) || defined(EVALUATE_SH_MIXED) return vertexValue;
Keyword
code:hlsl
#pragma multi_compile _ EVALUATE_SH_MIXED EVALUATE_SH_VERTEX Vertex shader
code:hlsl
struct Varyings
{
float4 positionCS : SV_POSITION;
float3 positionWS : TEXCOORD0;
float3 normalWS : TEXCOORD1;
half3 vertexSH : TEXCOORD2; // Add
};
Varyings vert(Attributes input)
{
Varyings output;
float3 positionWS = TransformObjectToWorld(input.positionOS.xyz);
float3 normalWS = NormalizeNormalPerVertex(TransformObjectToWorldNormal(input.normalOS));
half3 viewDir = GetWorldSpaceNormalizeViewDir(positionWS);
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.positionWS = positionWS;
output.normalWS = normalWS;
output.vertexSH = SampleProbeSHVertex(positionWS, normalWS, viewDir);
return output;
}
Vertex Shader で SH のサンプリングを行う
Fragment shader
code:hlsl
void frag(Varyings input, out half4 outColor : SV_Target0)
{
outColor.rgb = input.vertexSH; // Add
outColor.a = 1.0;
}
Fragment shader 側では Vertex Shader で計算したものをそのままつかう
-.icon
Refs
URP の SimpleLit.shader